package com.yidu.logisticssystem.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.yidu.logisticssystem.entity.LogisticsGate;
import com.yidu.logisticssystem.entity.LogisticsStaff;
import com.yidu.logisticssystem.entity.vo.GateVo;
import com.yidu.logisticssystem.service.LogisticsGateService;
import com.yidu.logisticssystem.utils.BaseMessage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 出勤表(LogisticsGate)表控制层
 *
 * @author 宋玉玲
 * @since 2021-03-08 16:46:49
 */
@Api(description = "出勤表")
@RestController
@RequestMapping("logisticsGate")
public class LogisticsGateController {
    /**
     * 服务对象
     */
    @Resource
    private LogisticsGateService logisticsGateService;

    //日志
    Logger log= LoggerFactory.getLogger(this.getClass());

    /**
     * 上班签到添加
     * @param logisticsGate
     * @param session
     * @return
     */
    @ApiOperation("上班签到添加表数据")
    @GetMapping("beOnDuty")
    public BaseMessage beOnDuty(LogisticsGate logisticsGate, HttpSession session){
        BaseMessage bm=new BaseMessage();
        //获取当前签到时间
        //使用simpleDateFormat格式化时间
       SimpleDateFormat sdf=new SimpleDateFormat();
        // 使用sdf的方法yyyy-MM-dd HH:mm:ss格式化时间
        sdf.applyPattern("yyyy-MM-dd HH:mm:ss");
        //当前时间
       Date date=new Date();
        //把当前生成日期放入出勤表
       logisticsGate.setGateBegin(sdf.format(date));
        // 格式化时间
        SimpleDateFormat sdf1=new SimpleDateFormat();
        // 使用sdf1的方法yyyy-MM-dd格式化时间
       sdf1.applyPattern("yyyy-MM-dd");
        //当前时间
      Date date1=new Date();
        //把当前生成日期放入出勤表
       logisticsGate.setGateDates(sdf1.format(date1));

        //调试日期和开始签到时间是否生成
        log.info("出勤表日期"+logisticsGate.getGateDates());
        log.info("开始签到时间"+logisticsGate.getGateBegin());
        //使用session获取对应的staff对象登录员工的编号
       LogisticsStaff logisticsStaff=(LogisticsStaff) session.getAttribute("staff");
        //把获取的当前员工编号放入出勤表中
       logisticsGate.setStaffNum(logisticsStaff.getStaffNum());
        //调试编号是否存在
        log.info("获取的员工编号"+logisticsGate.getStaffNum());
        //通过编号和日期来查询条数query
      int rows=logisticsGateService.query(logisticsGate);
        //判断条数为0那么就可以打卡添加，不为0则已经存在不能打卡
           if (rows==0) {
               //条件满足打卡成功添加数据
               logisticsGateService.insert(logisticsGate);
               bm.setState(1);
               bm.setMessage("上班打卡成功");
           }else {
               bm.setState(0);
               bm.setMessage("你已签过到了");
           }
        return bm;
    }

    /**
     * 下班签到修改
     * @param logisticsGate
     * @return
     */
    @ApiOperation("下班签到修改数据")
    @GetMapping("offDuty")
    public BaseMessage offDuty(LogisticsGate logisticsGate , HttpSession session){
        BaseMessage bm=new BaseMessage();
        //获取下班签到当前时间
        // 使用simpleDateFormat格式化时间
        SimpleDateFormat sdf = new SimpleDateFormat();
        // 使用sdf的方法yyyy-MM-dd HH:mm:ss格式化时间
        sdf.applyPattern("yyyy-MM-dd HH:mm:ss");
        //当前时间
        Date date=new Date();
        //把当前生成日期放入出勤表
        logisticsGate.setGateOut(sdf.format(date));
        //获取下班签到的当前日期
        // 使用simpleDateFormat格式化时间
        SimpleDateFormat sdf1 = new SimpleDateFormat();
        // 使用sdf的方法yyyy-MM-dd 格式化时间
        sdf1.applyPattern("yyyy-MM-dd");
        //当前时间
        Date date1=new Date();
        //使用字符串接收
       String gateDates=sdf1.format(date1);
        //把当前生成日期放入出勤表
        logisticsGate.setGateDates(gateDates);
        //使用session获取对应的staff对象登录员工的编号
        LogisticsStaff logisticsStaff=(LogisticsStaff) session.getAttribute("staff");
        //把获取的当前员工编号放入出勤表中
        logisticsGate.setStaffNum(logisticsStaff.getStaffNum());
        //调试员工编号和日期
        log.info("员工编号"+logisticsGate.getStaffNum());
        log.info("日期"+gateDates);
        //通过员工编号使用queryById来查询数据
        LogisticsGate logisticsGate1=logisticsGateService.queryById(logisticsGate.getStaffNum(), gateDates);
        //调试签退时间
        log.info("签退时间"+logisticsGate.getGateOut());
        //调试数据是否调试出来了
       log.info("签到时间"+logisticsGate1.getGateBegin());
        try {
            //结束时间使用sdf的parse方法毫秒化
            long gateOut = sdf.parse(logisticsGate.getGateOut()).getTime();
            //开始时间使用sdf的parse方法毫秒化
            long gateBegiin=sdf.parse(logisticsGate1.getGateBegin()).getTime();
            //计算一天上班时间，结束时间除以3600000再减去开始时间除以3600000；
           long gateDate= (gateOut/3600000)-(gateBegiin/3600000);
           //调试上班时长
            log.info("上班时长"+gateDate);
            //把计算出的上班时长放入出勤表中
            logisticsGate.setGateDate(String.valueOf(gateDate));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        //下班签到打卡，通过员工编号和日期来修改当天签到数据
        logisticsGateService.update(logisticsGate);
        bm.setState(0);
        bm.setMessage("下班打卡成功");
        return bm;
    }

    /**
     * 查询所有
     * @param vo
     * @param page
     * @param limit
     * @return
     */
    @ApiOperation("查询出勤表所有")
    @GetMapping("select")
    public Map<String, Object> queryAll(GateVo vo, int page, int limit){
        //分页助手
        PageHelper.startPage(page,limit);
        //调试模糊查询输入的两个值
        log.info(vo.getDates());
        log.info(vo.getGateNum());
        //map
        Map<String, Object> map=new HashMap<>();
        //使用list查询所有 queryAll
       List<LogisticsGate> list=logisticsGateService.queryAll(vo);
       //使用PageInfo传入查询的数据分页
       PageInfo<LogisticsGate> pageInfo=new PageInfo<>(list);
       //map
       map.put("code",0);
       map.put("msg","");
       map.put("data",pageInfo.getList());
       map.put("count",pageInfo.getTotal());
       return map;
    }

    /**
     * 根据id删除
     * @param gateId
     * @return
     */
    @ApiOperation("根据id删除出勤表数据")
    @PostMapping("delete")
    public BaseMessage delete(int gateId){

        return logisticsGateService.deleteById(gateId)>0?
                BaseMessage.succes():BaseMessage.fail();
    }

    /**
     * 根据id查询
     * @param gateId
     * @return
     */
    @ApiOperation("根据id查询出勤表数据")
    @PostMapping("selectId")
    public BaseMessage selectId(int gateId){
        LogisticsGate logisticsGate=logisticsGateService.selectId(gateId);
        return BaseMessage.succes(logisticsGate);
    }

    /**
     * 根据id判断添加或修改
     * @param logisticsGate
     * @return
     */
    @ApiOperation("添加和修改出勤表，id为空为添加，id有值为修改")
    @PostMapping("addOrUpdate")
    public BaseMessage addOrUpdate(Integer gateId, LogisticsGate logisticsGate) {
        BaseMessage bm = new BaseMessage();

        log.info("获取的id"+gateId);
        if (gateId == null) {
            logisticsGateService.insert(logisticsGate);
            bm.setState(1);
            bm.setMessage("增加成功");
        } else {
            logisticsGateService.updateId(logisticsGate);
            bm.setState(0);
            bm.setMessage("修改成功");
        }
        return bm;
    }

    /**
     * 批量删除
     * @param gateId
     * @return
     */
    @ApiOperation("批量删除")
    @PostMapping("batch")
    public BaseMessage batch(String gateId){
        return logisticsGateService.delete(gateId) > 0 ?
                BaseMessage.succes() : BaseMessage.fail();

    }

}
